package com.buba.utils;

import entity.device.DeviceType;

import java.util.ArrayList;
import java.util.List;

/**
 * @param
 * @Author gwq
 * @Description 使用递归函数构建菜单树
 * @Date 2023/3/31 20:03
 * @Return
 */
public class TreeMenu {

    private List<DeviceType> treeMenu = new ArrayList<>();

    public TreeMenu(List<DeviceType> treeMenu) {
        this.treeMenu = treeMenu;
    }

    /**
     * @Author gwq
     * @Description 建立树形结构
     * @Date 2023/3/31 14:27
     * @Return java.util.List<entity.system.Proces>
     */
    public List<DeviceType> getTreeMenu() {
        // 创建树
        List<DeviceType> treeMenu = new ArrayList<>();
        // 遍历父节点集合
        for (DeviceType parentMenu : getParentNodes()) {
            // 调用获取子节点的方法 传入一个父节点 来获取当前父节点的子节点
            parentMenu = getChildrenNodes(parentMenu);
            // 将父节点存入树
            treeMenu.add(parentMenu);
        }
        // 返回树
        return treeMenu;
    }

    /**
     * @param parentMenu
     * @Author gwq
     * @Description 获取子节点
     * @Date 2023/3/31 14:27
     * @Return entity.system.Proces
     */
    public DeviceType getChildrenNodes(DeviceType parentMenu) {
        // 创建子节点
        List<DeviceType> childrenNodes = new ArrayList<>();
        // 获取子节点
        for (DeviceType nodeMenu : treeMenu) {
            // 如果此节点的 parentId 等于 传入的父节点的 id 那么此节点为子节点
            if (nodeMenu.getId().equals(parentMenu.getParentId())) {
                // 使用递归函数 从每一个节点中获取子节点 存入子节点
                childrenNodes.add(getChildrenNodes(nodeMenu));
            }
        }
        // 将子节点集合存入父节点对象当中
        parentMenu.setChildren(childrenNodes);
        // 返回父节点
        return parentMenu;
    }


    /**
     * @Author gwq
     * @Description 获取父节点
     * @Date 2023/3/31 14:27
     * @Return java.util.List<entity.system.Proces>
     */
    public List<DeviceType> getParentNodes() {
        // 创建父节点
        List<DeviceType> parentNodes = new ArrayList<>();
        // 获取根节点
        for (DeviceType nodeMenu : treeMenu) {
            // 如果 parentId 为 0，那么此节点为根节点
            if (nodeMenu.getParentId() == 0) {
                // 将此节点存入集合
                parentNodes.add(nodeMenu);
            }
        }
        // 返回父节点
        return parentNodes;
    }
}
